package com.example.home.activity

import android.annotation.SuppressLint
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.example.base.BaseActivity
import com.example.config.KeyConfig
import com.example.home.R
import com.example.home.data.Scales
import com.example.home.data.laScales
import com.example.home.data.miScales
import com.example.home.data.reScales
import com.example.home.data.siScales
import com.example.home.data.solScales

/**
 * 吉他指型详情页面Activity
 * 
 * 主要功能：
 * 1. 显示不同指型的音阶图谱
 * 2. 支持随机生成音阶练习
 * 3. 可调节生成间隔时间
 * 4. 显示音阶名称和升降号标记
 * 
 * 支持的指型：Mi型、Sol型、La型、Si型、Re型
 */
class FingerShapeDetailAct : BaseActivity() {

    /**
     * 当前选择的指型位置
     * 0-Mi型, 1-Sol型, 2-La型, 3-Si型, 4-Re型
     */
    private var currentPos: Int = -1
    
    /**
     * 是否正在生成随机音符的标志位
     * true-正在生成, false-已停止
     */
    private var isGenerating = false
    
    /**
     * 主线程Handler，用于更新UI
     */
    private var handler : Handler?=null
    
    /**
     * 生成音符的时间间隔（毫秒）
     * 默认1秒，可通过Spinner调节
     */
    private var intervalMs: Long = 1000 // 默认时间间隔为1秒

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 使用 DataBindingUtil 设置布局
        val binding = DataBindingUtil.setContentView<com.example.home.databinding.ActFingerShapeDetailBinding>(this, R.layout.act_finger_shape_detail)
            
        // 从Intent中获取传递的指型类型
        currentPos = intent.getIntExtra(KeyConfig.FINGER_SHAPE_IS, -1)
        
        // 初始化主线程Handler，用于在后台线程中更新UI
        binding.homeFragTitle.baseTitleIvLeft.visibility = View.VISIBLE
        handler = Handler(Looper.getMainLooper())
        
        // 根据指型类型更新页面布局和内容
        updateLayout(binding,currentPos)
        update(binding,currentPos)

        // 设置返回按钮点击事件
        binding.homeFragTitle.viewBack.setOnClickListener {
            finish()
        }
        
        // 设置时间间隔选择功能
        setupIntervalSelection(binding)
    }
    
    /**
     * 设置时间间隔选择器
     * 
     * 功能：
     * 1. 创建Spinner适配器，显示时间选项
     * 2. 设置默认选择为1秒
     * 3. 监听用户选择，更新intervalMs变量
     * 
     * @param binding 数据绑定对象
     */
    private fun setupIntervalSelection(binding: com.example.home.databinding.ActFingerShapeDetailBinding) {
        // 创建Spinner适配器，从字符串资源中获取时间选项
        val adapter = ArrayAdapter.createFromResource(
            this,
            R.array.interval_options,
            android.R.layout.simple_spinner_item
        ).apply {
            setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        }
        
        // 设置适配器到Spinner
        binding.intervalSpinner.adapter = adapter
        
        // 默认选择1秒（索引为1）
        binding.intervalSpinner.setSelection(1)
        
        // 设置选择监听器，根据用户选择更新时间间隔
        binding.intervalSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                // 根据选择的位置设置对应的时间间隔
                intervalMs = when (position) {
                    0 -> 500    // 0.5秒
                    1 -> 1000   // 1秒
                    2 -> 1500   // 1.5秒
                    3 -> 2000   // 2秒
                    4 -> 2500   // 2.5秒
                    5 -> 3000   // 3秒
                    else -> 1000  // 默认1秒
                }
            }

            override fun onNothingSelected(parent: AdapterView<*>?) {
                intervalMs = 1000  // 默认1秒
            }
        }
    }

    /**
     * 根据指型类型更新页面布局
     * 
     * 功能：
     * 1. 根据指型类型显示对应的指型图片
     * 2. 设置对应的标题文本
     * 
     * @param binding 数据绑定对象
     * @param fingerShapeKey 指型类型键值（0-4分别对应Mi、Sol、La、Si、Re型）
     */
    private fun updateLayout(binding: com.example.home.databinding.ActFingerShapeDetailBinding,fingerShapeKey: Int?) {
        // 根据指型类型获取对应的图片资源和标题资源
        val (imageRes, titleRes) = when (fingerShapeKey) {
            0 -> R.mipmap.mi_finger_shape to R.string.mi_guitar_finger_shape
            1 -> R.mipmap.sol_finger_shape to R.string.sol_guitar_finger_shape
            2 -> R.mipmap.la_finger_shape to R.string.la_guitar_finger_shape
            3 -> R.mipmap.si_finger_shape to R.string.si_guitar_finger_shape
            4 -> R.mipmap.re_finger_shape to R.string.re_guitar_finger_shape
            else -> R.mipmap.mi_finger_shape to R.string.mi_guitar_finger_shape // 默认值
        }
        
        // 设置指型图片和标题
        binding.homeCardboardScaleDiagram.setImageResource(imageRes)
        binding.homeFragTitle.baseTitleTvMiddle.text = getString(titleRes)
    }

    /**
     * 更新页面功能和事件监听
     * 
     * 功能：
     * 1. 初始化对应指型的音阶数据
     * 2. 设置开始按钮事件：开始随机生成音阶练习
     * 3. 设置停止按钮事件：停止音阶生成
     * 
     * @param binding 数据绑定对象
     * @param fingerShapeKey 指型类型键值
     */
    @SuppressLint("SetTextI18n")
    private fun update(binding:com.example.home.databinding.ActFingerShapeDetailBinding,fingerShapeKey:Int){
        // 先停止之前可能正在进行的生成任务
        stopGeneratingRandomNotes(binding)

        // 根据指型类型获取对应的音阶数据
        val scales = when(fingerShapeKey){
            0 -> Scales(miScales)   // Mi型音阶
            1 -> Scales(solScales)  // Sol型音阶
            2 -> Scales(laScales)   // La型音阶
            3 -> Scales(siScales)   // Si型音阶
            4 -> Scales(reScales)   // Re型音阶
            else -> Scales(miScales) // 默认使用Mi型音阶
        }

        // 设置开始按钮点击事件
        binding.start.setOnClickListener {
            isGenerating = true
            binding.start.isEnabled = false    // 禁用开始按钮
            binding.over.isEnabled = true      // 启用停止按钮
            
            // 在后台线程中生成随机音阶
            Thread {
                while (isGenerating) {
                    // 随机选择一个音阶位置（1-7级）
                    val randomNum = (0..6).random()
                    val note = scales.miScopeType[randomNum]
                    
                    // 随机选择该音阶的一个可能状态（如升号、降号等）
                    val statusCount = note.possibleStates.size
                    val pitchHeight = (0..<statusCount).random()
                    val scale = note.possibleStates[pitchHeight]
                    
                    // 在主线程中更新UI
                    handler?.post {
                        // 显示音阶级数（1-7）
                        binding.scaleName.text = (randomNum+1).toString()
                        // 显示实际音阶名称
                        binding.realScaleName.text = note.scale
                        
                        // 根据音阶状态显示对应的升降号标记
                        when (scale) {
                            0 -> {
                                // 降号
                                binding.fallingTone.visibility = View.VISIBLE
                                binding.risingTone.visibility = View.GONE
                                binding.doubleRisingTone.visibility = View.GONE
                            }
                            2 -> {
                                // 升号
                                binding.fallingTone.visibility = View.GONE
                                binding.risingTone.visibility = View.VISIBLE
                                binding.doubleRisingTone.visibility = View.GONE
                            }
                            3->{
                                // 双升号
                                binding.fallingTone.visibility = View.GONE
                                binding.risingTone.visibility = View.VISIBLE
                                binding.doubleRisingTone.visibility = View.VISIBLE
                            }
                            else -> {
                                // 自然音（无升降号）
                                binding.fallingTone.visibility = View.GONE
                                binding.risingTone.visibility = View.GONE
                                binding.doubleRisingTone.visibility = View.GONE
                            }
                        }
                    }
                    // 按照设定的时间间隔休眠
                    Thread.sleep(intervalMs)
                }
            }.start()
        }

        // 设置停止按钮点击事件
        binding.over.setOnClickListener {
            stopGeneratingRandomNotes(binding)
        }
    }

    /**
     * 停止生成随机音符
     * 
     * 功能：
     * 1. 设置停止标志位
     * 2. 重置按钮状态
     * 3. 清除Handler中的待处理任务
     * 
     * @param binding 数据绑定对象
     */
    private fun stopGeneratingRandomNotes(binding: com.example.home.databinding.ActFingerShapeDetailBinding) {
        isGenerating = false                // 设置停止标志
        binding.start.isEnabled = true     // 启用开始按钮
        binding.over.isEnabled = false     // 禁用停止按钮
        handler?.removeCallbacksAndMessages(null)  // 清除所有待处理的UI更新任务
    }

    /**
     * Activity销毁时的清理工作
     * 
     * 功能：
     * 1. 清除Handler中的所有待处理消息和回调
     * 2. 防止内存泄漏
     */
    override fun onDestroy() {
        super.onDestroy()
        handler?.removeCallbacksAndMessages(null) // 清除所有待处理的消息和回调
    }
}
